package futbolfacil.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

import futbolfacil.excepcion.DAOExcepcion;
import futbolfacil.modelo.Cliente;
import futbolfacil.modelo.DetalleMantenimiento;
import futbolfacil.modelo.Mantenimiento;
import futbolfacil.util.ConexionBD;

public class MantenimientoDAO extends BaseDAO {

	public void insertar(Mantenimiento man, DetalleMantenimiento det) throws DAOExcepcion {
		System.out.println("MantenimientoDAO: insertar(Mantenimiento man)");
		
		validarDatos(man);
		if(!verificarAlquiler(det.getCancha().getCodigoCancha(), man.getFecha(), man.getHoraInicio(), man.getHoraFin())) {
		
			String query = "INSERT INTO mantenimiento (man_nro, man_fec, man_dia_ini, man_hor_ini, man_dia_fin, man_hor_fin, man_pre) " +
						   "VALUES (?,?,?,?,?,?,?)";
			Connection con = null;
			PreparedStatement stmt = null;
			try {
				con = ConexionBD.obtenerConexion();
				stmt = con.prepareStatement(query);	
				stmt.setInt(1, man.getNroMantenimineto());
				stmt.setString(2, man.getFecha());
				stmt.setString(3, man.getFechaInicio());
				stmt.setString(4, man.getHoraInicio());
				stmt.setString(5, man.getFechaFin());
				stmt.setString(6, man.getHoraFin());
				stmt.setDouble(7, man.getPrecio());
				
				int i = stmt.executeUpdate();
				insertarDetalle(det, man.getNroMantenimineto());
				
				if (i != 1) {
					throw new SQLException("No se pudo insertar");
				}
			} catch (SQLException e) {
				System.err.println(e.getMessage());
				throw new DAOExcepcion(e.getMessage());
			} finally {
				this.cerrarStatement(stmt);
				this.cerrarConexion(con);
			}
		
		} else {
			System.out.println("La cancha se encuentra alquilada!");
		}
	}
	
	public void insertarDetalle(DetalleMantenimiento det, int codMantenimiento) throws DAOExcepcion {
		System.out.println("DetalleMantenimientoDAO: insertar(Mantenimiento man)");
		String query = "INSERT INTO mantenimiento_detalle (man_det_des, art_cod, man_nro) " +
				"VALUES (?,?,?)";
		Connection con = null;
		PreparedStatement stmt = null;
		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);		
			stmt.setString(1, det.getDescripcion());
			stmt.setInt(2, det.getCancha().getCodigoCancha());
			stmt.setInt(3, codMantenimiento);
			
			int i = stmt.executeUpdate();
			if (i != 1) {
				throw new SQLException("No se pudo insertar");
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
	}
	
	private void validarDatos(Mantenimiento objMan) throws DAOExcepcion {
		System.out.println("MantenimientoDAO: validarDatos(Mantenimiento vo)");
		
		String msg = "";
		
		if(objMan.getFecha().trim().equals(""))
			msg += "La fecha no puede ser vacio. \n";
		if(objMan.getHoraInicio().trim().equals(""))
			msg += "La hora de inicio no puede ser vacio. \n";
		if(objMan.getHoraFin().trim().equals(""))
			msg += "La hora fin no puede ser vacio. \n";
		if(!msg.equals("")) {
			System.out.println("ERROR: \n" + msg);
			throw new DAOExcepcion(msg);
		}	
	}
	
	private boolean verificarAlquiler(int idCancha, String fecha, String horaIni, String horaFin) {
		System.out.println("MantenimientoDAO: verificarAlquiler()");
		
		String query = "SELECT a.alq_nro FROM alquiler a, alquiler_detalle ad WHERE art_cod = ? " +
				"AND a.alq_nro=ad.alq_nro AND " +
				"(alq_fec = ? AND alq_det_hor_ini between ? AND ?) AND " +
				"(alq_fec = ? AND alq_det_hor_ini = ? OR alq_det_hor_fin = ?)";
		
		/*String query = "SELECT a.alq_nro FROM alquiler a, alquiler_detalle ad WHERE a.alq_nro=ad.alq_nro " +
					   "AND art_cod = ? AND alq_fec = ?";*/
		
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		
		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setInt(1, idCancha);
			stmt.setString(2, fecha);
			stmt.setString(3, horaIni);
			stmt.setString(4, horaFin);
			stmt.setString(5, fecha);
			stmt.setString(6, horaIni);
			stmt.setString(7, horaFin);
			
			rs = stmt.executeQuery();			
			if (rs.next()){
				return true;
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return false;
	}
	
	public int obtenerID() throws DAOExcepcion {
		
		String query = "SELECT MAX(man_nro) AS newID FROM mantenimiento";
		
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		
		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			rs = stmt.executeQuery();
			if (rs.next()) {
				return rs.getInt("newID");
			} else {
				return rs.getInt("newID");
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}

	}
	
}
